内置集合
在讲迭代器和生成器之前,先要了解Python 共内置了 list
、 tuple
、dict
和 set
四种基本集合,每个 集合对象都能够迭代。
tuple 类型
1 | tup = ('python', 2.7, 64) |
程序将以此按行输出 ‘python’, 2.7 和 64。
dictionary 类型
1 | dic = {} |
输出的结果为:platform 64,lan python, version 2.7
, 字典在迭代的过程 中将 key
作为可迭代的对象返回。注意字典中 key
是乱序的,也就是说和插入 的顺序是不一致的。如果想要使用顺序一致的字典,请使用 collections
模块 中的 OrderedDict
对象。
1 | import collections |
1 | s = set(['python', 'python2', 'python3','python']) |
将会输出 python, python3, python2
set 集合将会去除重复项,注意输出的 结果也不是按照输入的顺序。>
为什么会有迭代器和生成器?因为我们有的时候需要这四种集合特殊的规律,比如Fibonacci数列
多种多样的需求肯定不能个个都内建,因此我们需要自己来构建
迭代器
Python 中的 for
句法实际上实现了设计模式中的迭代器模式 ,所以我们自己也可以按照迭代器的要求,自己生成迭代器对象,以便在 for
语句中使用。比如我想要一个迭代器每次循环的次数时按照Fibonacci序列,1,1,2,3,5,8 …… 只要类中实现了 __iter__
和 next
函数,那么对象就可以在 for
语句中使用。 现在创建 Fibonacci 迭代器对象,
1 | # define a Fib class |
将会输出前 5 个 Fibonacci 数据 1,1, 2, 3, 5
如果Fib(6)
,此时这个迭代器输出为1,1,2,3,5,8
生成器
除了使用迭代器以外,Python 使用 yield
关键字也能实现类似迭代的效果,yield
语句每次 执行时,立即返回结果给上层调用者,而当前的状态仍然保留,以便迭代器下一次循环调用。这样做的 好处是在于节约硬件资源,在需要的时候才会执行,并且每次只执行一次。
1 | def fib(max): |
将会输出前 5 个 Fibonacci 数据 1,1, 2, 3, 5